package com.ck.dao;

import java.util.List;

import com.ck.model.company.dto.CpDeviceGroupTreeListForProgramDTO;
import org.apache.ibatis.annotations.Param;

import com.ck.model.common.DeviceGroup;
import com.ck.model.company.dto.CpDeviceGroupListDTO;
import com.ck.model.company.dto.CpDeviceGroupTreeListDTO;

public interface DeviceGroupMapper {

	/**
	 * 所有终端分组列表
	 * @param companyCode 
	 *
	 * @return List<DeviceGroupListDTO>
	 */
	List<CpDeviceGroupListDTO> listAllDeviceGroup(@Param("companyCode")String companyCode);

	/**
	 * 保存终端分组
	 *
	 * @param deviceGroup TbDeviceGroup类型对象
	 */
	void saveDeviceGroup(DeviceGroup deviceGroup);

	/**
	 * 更新终端分组
	 *
	 * @param deviceGroup TbDeviceGroup类型对象
	 */
	void updateDeviceGroup(DeviceGroup deviceGroup);

	/**
	 * 获取终端分组
	 * @param companyCode 
	 *
	 * @param deviceGroupId 终端分组ID
	 */
	DeviceGroup getDeviceGroupById(@Param("companyCode")String companyCode, @Param("deviceGroupId")Long deviceGroupId);

	/**
	 * 删除终端分组
	 *
	 * @param deviceGroupId 终端分组ID
	 */
	void deleteDeviceGroupById(@Param("companyCode")String companyCode, @Param("deviceGroupId")Long deviceGroupId);

	/**
	 * 通过父ID获取终端分组列表
	 *
	 * @param parentId 父ID
	 * @return List<TbDeviceGroup>
	 */
	List<DeviceGroup> listDeviceGroupByParentId(@Param("companyCode")String companyCode, @Param("parentId")Long parentId);

	/**
	 * 根据分组名查找终端分组
	 *
	 * @param groupName 分组名
	 * @return TbDeviceGroup
	 */
	DeviceGroup getDeviceGroupByGroupName(@Param("companyCode") String companyCode,@Param("groupName") String groupName);

	/**
	 * 根据分组码获取终端分组
	 *
	 * @param groupCode 分组码
	 * @return TbDeviceGroup
	 */
	DeviceGroup getDeviceGroupByGroupCode(@Param("companyCode") String companyCode,@Param("groupCode")String groupCode);
	
	/**
	 * 所有终端树形分组列表
	 * @param companyCode 
	 * @return
	 */
	List<CpDeviceGroupTreeListDTO> listAllDeviceGroupTree(@Param("companyCode") String companyCode);

	/**
	 * 修改终端的分组
	 * @param groupCode 分组码
	 * @param deviceCodes 终端code List
	 * @param companyCode 
	 */
    void moveDeviceGroup(@Param("companyCode") String companyCode,@Param("deviceGroupId") Long deviceGroupId, @Param("deviceCodes") List<String> deviceCodes);

	/**
	 * 查询所有终端分组
	 * @param companyCode
	 * @return List<CpDeviceGroupTreeListForProgramDTO>
	 */
	List<CpDeviceGroupTreeListForProgramDTO> listAllDeviceGroupTreeForProgram(@Param("companyCode") String companyCode);

	/**
	 * 根据投放时间段查询已投放的终端组ID
	 *
	 * @param companyCode 商家编码
	 * @param startTimeL 投放开始时间
	 * @param endTimeL 投放结束时间
	 * @return List<String>
	 */
    List<String> listAllDeviceGroupByTime(@Param("companyCode") String companyCode, @Param("startTime") Long startTimeL,
										  @Param("endTime") Long endTimeL);

	/**
	 * 根据投放时间段查询可投放的终端组
	 *
	 * @param companyCode 商家编码
	 * @param alreadyPutinGroupIdList 已投放的终端组id集合
	 * @return List<CpDeviceGroupTreeListDTO>
	 */
	List<CpDeviceGroupTreeListDTO> deviceGroupTreeListByTime(@Param("companyCode") String companyCode,
															 @Param("alreadyPutinGroupIdList") List<String> alreadyPutinGroupIdList);
}
